--- title: "L2-010 排座位" created: 2025-11-28 tags: - 算法 --- # L2-010 排座位 ## 题目 [L2-010 排座位](https://pintia.cn/problem-sets/994805046380707840/exam/problems/type/7?problemSetProblemId=994805066135879680&page=1) ![[image-72c6dd54.png]] ## 思路分析 找关系——并查集 用rela记录两两间的直接关系 用并查集记录间接关系 ```cpp struct DSU{ vector fa; DSU(int n){ fa.resize(n+1); for(int i=0;i<=n;i++) fa[i]=i; } int find(int x){ if(fa[x]!=x) fa[x]=find(fa[x]); return fa[x]; } void unite(int x,int y){ int fx=find(x); int fy=find(y); if(fx!=fy) fa[fx]=fy; } bool connected(int x,int y){ return find(x)==find(y); } } ``` ## 代码实现 ```cpp #include using namespace std; #define endl '\n' using ll = long long; using ull = unsigned long long; using PII = pair; using Pll = pair; int dx[4]={-1,0,1,0},dy[4]={0,1,0,-1}; const int inf = 0x3f3f3f3f; struct DSU{ vector fa; DSU(int n){ fa.resize(n+1); for(int i=0;i<=n;i++){ fa[i]=i; } } int find(int x){ if(fa[x]!=x) fa[x]=find(fa[x]); return fa[x]; } void unite(int x,int y){ int fx=find(x); int fy=find(y); if(fx!=fy) fa[fx]=fy; } bool connected(int x,int y){ return find(x)==find(y); } }; const int MAXN = 105; int rela[MAXN][MAXN]; int main() { ios::sync_with_stdio(0),cin.tie(0),cout.tie(0); int N,M,K;cin>>N>>M>>K; DSU dsu(N); int a,b,c; for(int i=1;i<=M;i++){ cin>>a>>b>>c; rela[a][b]=rela[b][a]=c; if(c==1) dsu.unite(a,b); } for(int i=1;i<=K;i++){ cin>>a>>b; if(rela[a][b]!=-1 && dsu.connected(a,b)) cout<<"No problem"<